package com.bestcem.xm.award.controller.dto.draw;

import com.bestcem.xm.award.enums.AwardLevelEnum;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;

import static com.bestcem.xm.award.constant.Constants.DrawAwardParamsRule.*;

/**
 * 抽奖奖励DTO
 *
 * @author hang.li <hang.li@idiaoyan.com>
 * @version v1.0
 * @date 2021/8/20 16:23
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DrawAwardDTO {

    /**
     * 奖励id
     */
    private String id;

    /**
     * 奖励名称
     */
    @NotBlank(message = "奖励名称缺失")
    private String name;

    /**
     * 问卷id
     */
    @JsonProperty(value = "project_id")
    private String projectId;

    /**
     * 公司id
     */
    @JsonProperty(value = "org_id")
    private String orgId;

    /**
     * 奖励类型
     */
    @JsonProperty(value = "type")
    @NotNull(message = "奖励类型缺失")
    private Integer type;

    /**
     * 奖项列表
     */
    @JsonProperty(value = "draw_awards")
    @Valid
    @NotEmpty(message = "奖项列表缺失")
    private List<DrawAward> drawAwards;

    /**
     * 奖项基本配置
     */
    @Valid
    @NotNull(message = "奖项配置缺失")
    private DrawAwardBasic basic;

    /**
     * 发放规则
     */
    private Issue issue;

    /**
     * 抽奖规则
     */
    private Rule rule;

    /**
     * 抽奖奖项
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static final class DrawAward {

        /**
         * Required. 奖项名称,列表内唯一
         */
        @NotBlank(message = "奖项名称缺失")
        private String name;

        /**
         * Required. 中奖概率
         */
        @NotBlank(message = "奖项概率缺失")
        @Pattern(regexp = "([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9])", message = "奖项概率格式错误")
        private String probability;

        /**
         * Required. 奖项数量
         */
        @Max(value = 999999, message = "奖项数量上限为999999")
        @Min(value = 0, message = "奖项数量设置错误")
        private Integer num;

        /**
         * Required. 奖项等级 {@link AwardLevelEnum}
         */
        @NotNull(message = "奖项等级缺失")
        @Min(value = 0, message = "奖项等级错误")
        @Max(value = 8, message = "奖项等级错误")
        private Integer level;

        /**
         * Optional. 奖项简介
         */
        private String desc;

        /**
         * Optional. 奖项图片
         */
        @JsonProperty(value = "img_url")
        private String imgUrl;

        /**
         * 奖项发放方式
         */
        @NotNull(message = "奖项发放方式缺失")
        @Min(value = 0, message = "奖项发放方式错误")
        @Max(value = 1, message = "奖项发放方式错误")
        private Integer method;

        /**
         * 奖项兑奖码前缀
         */
        @Pattern(regexp = "(^\\s*)|([a-zA-Z]{2})", message = "兑奖码前缀格式错误")
        private String prefix;

        /**
         * 领奖提示
         */
        @NotBlank(message = "奖项领奖提示缺失")
        @Length(max = AWARD_TIP_MAX_LENGTH, message = AWARD_TIP_LENGTH_ERROR_MESSAGE)
        private String tip;

        /**
         * 奖项等级描述
         */
        @NotBlank(message = "奖项等级描述缺失")
        @JsonProperty(value = "level_str")
        private String levelStr;
    }

    /**
     * 奖励基本配置
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static final class DrawAwardBasic {
        /**
         * 奖励开始时间
         */
        @JsonProperty(value = "start_time")
        private String startTime;

        /**
         * 奖励结束时间
         */
        @JsonProperty(value = "end_time")
        private String endTime;

        /**
         * 抽奖次数限制
         */
        @JsonProperty(value = "total_count")
        @Max(value = 999999, message = "抽奖总数上限为999999")
        @Min(value = 0, message = "抽奖总数设置错误")
        private Integer totalCount;

        /**
         * logo配置
         */
        @JsonProperty(value = "display_logo")
        private DisplayLogo displayLogo;
    }

    /**
     * logo配置
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static final class DisplayLogo {
        /**
         * 文件id
         */
        private String id;

        /**
         * 文件名称
         */
        private String name;

        /**
         * oss链接
         */
        private String url;
    }

    /**
     * 发放配置
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static final class Issue {
        /**
         * 短信内容
         */
        @JsonProperty(value = "sms_content")
        @Length(max = SMS_CONTENT_MAX_LENGTH, message = SMS_CONTENT_LENGTH_ERROR_MESSAGE)
        private String smsContent;

        /**
         * 短信模板id
         */
        @JsonProperty(value = "template_id")
        private String templateId;

        /**
         * 短信模板名称
         */
        @JsonProperty(value = "template_title")
        private String templateTitle;

        /**
         * 奖励发放方式
         */
        private Integer type;

        /**
         * 兑奖操作提示
         */
        private String tip;

        /**
         * 兑奖码前缀
         */
        private String prefix;
    }

    /**
     * 抽奖规则限制
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static final class Rule {

        /**
         * 单个手机号抽奖次数限制
         */
        private Integer draw;

        /**
         * 单个手机号中奖次数限制
         */
        private Integer win;

        /**
         * 答题时间限制
         */
        private Integer time;

        /**
         * 答卷评分限制
         */
        private Integer score;

        /**
         * 有效期内达到抽奖次数提前结束奖励
         */
        @JsonProperty(value = "stop_award")
        private Boolean stopAward;
    }
}
